const { ERROR } = require('./error');

function getHttpClientInfo() {
    const requestId = this.getUniCloudRequestId();
    const { clientIP, userAgent, source, secretType = 'none' } = this.getClientInfo();
    const { clientInfo = {} } = JSON.parse(this.getHttpInfo().body);

    return {
        ...clientInfo,
        clientIP,
        userAgent,
        source,
        secretType,
        requestId,
    };
}

function getHttpUniIdToken() {
    const { uniIdToken = '' } = JSON.parse(this.getHttpInfo().body);

    return uniIdToken;
}

function verifyHttpMethod() {
    const { headers, httpMethod } = this.getHttpInfo();

    if (!/^application\/json/.test(headers['content-type']) || httpMethod.toUpperCase() !== 'POST') {
        throw {
            errCode: ERROR.UNSUPPORTED_REQUEST,
            errMsg: 'unsupported request',
        };
    }
}

function universal() {
    if (this.getClientInfo().source === 'http') {
        verifyHttpMethod.call(this);
        this.getParams()[0] = JSON.parse(this.getHttpInfo().body).params;
        this.getUniversalClientInfo = getHttpClientInfo.bind(this);
        this.getUniversalUniIdToken = getHttpUniIdToken.bind(this);
    } else {
        this.getUniversalClientInfo = this.getClientInfo;
        this.getUniversalUniIdToken = this.getUniIdToken;
    }
}

module.exports = universal;
